class Person {
  // 静态属性 -> 在Person类上
  static id = 123;

  /*
    public 公共公开的，任何方式都能访问
    protected 受保护的，只能在父类或子类中才能访问(实例对象不能访问)
    private 私有的，只能在父类中才能访问
  */
  // 普通属性 -> 在实例对象（p）上
  public name: string;
  protected age: number;
  private sex: number;
  // 类的构造方法，当你new Person() 时会自动调用constructor方法
  // new Person()传递的参数，会传递给constructor方法
  constructor(name: string, age: number, sex: number) {
    // this指向产生的实例对象（p）
    // 属性
    this.name = name;
    this.age = age;
    this.sex = sex;
  }

  // 方法
  public setName(name: string) {
    this.name = name;
  }

  private sayAge() {
    console.log(this.age); // 可以访问
    console.log(this.sex); // 可以访问
  }
}

const p = new Person("jack", 18, 1);
// console.log(p.age); // 报错
// console.log(p.sex); // 报错
console.log(Person.id);

class Son extends Person {
  constructor(name: string, age: number, sex: number) {
    // super() 其实调用的父类 constructor()
    super(name, age, sex);
  }

  saySonAge() {
    console.log(this.age); // 可以访问
    // console.log(this.sex); // 报错
  }
}

const s = new Son("tom", 16, 1);
// console.log(s.age); // 报错
// console.log(s.sex); // 报错

// const obj: Person = {
//   name: "rose",
//   age: 20,
//   setName() {},
// };
